為了送一筆足夠隱私的交易,似乎需要自己跑節點才有辦法做到,若使用公共的節點,好像會洩露一些交易的內容?我不確定。我過去都是使用免費的公共節點,infura, alchemy, publicnode.com, 不然就是去chainlist.org 找,過去嘗試跑節點但最後都放棄,覺得太難而且不知道跑了有什麼好處。
今天就來紀錄跑節點的歷程,許多知識我只能先略過,因為我也不懂,透過 GenAI 的協助,只能邊跑邊學習了。
節點的軟體生態系與多樣性統計數據可以看這兩個網站:
概念介紹我是看這篇:如何跑起以太坊執行層與共識層客戶端,文中最後跑的執行層是 Nethermind,共識層是 Prysm。
我這次要跑的是 Geth 和 Lodestar,一樣不跑 Validator Client。這次要使用 GCP 免費三個月的方案,那我們開始吧!
首先到 Google Cloud,找到 Compute Engine 的地方,按 CREATE INSTANCE 開始進入設定
設定名字,選擇地點台灣
預設是 E2 我選 N2
系統我選 Ubuntu 24.04 LTS x86/64,注意 Size 試用版最大開到 500 GB
防火牆我不是很懂,都打勾,IP forwarding 也打開
其他保持原樣,接下來設定 ssh,首先在本地產 key
ssh-keygen
我使用 MacOS,公鑰的位置預設在 cat .ssh/id_ed25519.pub
直接在中央上方欄搜尋 Metadata,選擇 SSH KEYS
然後貼上你的公鑰,這裡的 Username 要記住,配上左側 VM instances 找到 VM 看到欄位 External IP 記下來。
從本地 ssh 到 VM
ssh <username>@<external-ip>
成功進到 VM 後,開始建置環境,安裝 Nodejs 和一些必要的工具
sudo apt-get update
# nodejs
sudo apt install curl
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash
source ~/.bashrc
nvm install node
npm install -g yarn
sudo apt install build-essential
調整機器的時間
sudo timedatectl set-timezone Asia/Taipei
timedatectl
直接安裝 geth
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
下載與建立 lodestar
git clone -b stable https://github.com/chainsafe/lodestar.git
cd lodestar
yarn install
yarn run build
確認以下兩個指令跑得動!
geth -h | less
PS: less 的用法:空白鍵下一頁,b 是上一頁。
cd lodestar
./lodestar --help
我要使用 sepolia 測試網,目標是透過 JSON RPC API 成功送一個交易,因此希望節點同步愈快愈好。
首先建立一個 JWT token 在 ~
,這是為了讓 geth 與 lodestar 溝通用的
openssl rand -hex 32 | tr -d "\n" > "jwt.hex"
geth --syncmode "snap" \
--authrpc.jwtsecret /home/me/jwt.hex \
--http --http.addr "0.0.0.0" --http.api net,eth,personal,web3,engine,admin \
--sepolia
--syncmode
: 預設就是 snap 因此可略,另一個模式叫 full,會比較久。--authrpc.jwtsecret
: 指定 jwt token 的位置--http
: 開通 JSON RPC API--http.addr "0.0.0.0"
: 設定任意 IP 都可以請求--http.api
: 要開通的 api,比較常用的應該是 eth--sepolia
: 測試網(推薦搭配賽波利雅之歌)
./lodestar beacon --network=sepolia \
--jwt-secret=/home/me/jwt.hex \
--checkpointSyncUrl=https://beaconstate-sepolia.chainsafe.io
--jwt-secret
: 指定 jwt token 的位置--checkpointSyncUrl
: 以下說明
關於共識層的 checkpoint sync 我還不懂,好像會讓同步比較快因此就使用了,之後有機會再來補充相關知識,目前先提供參考資料:
為了確保 ssh 連線斷掉後 VM 能夠繼續運作兩個客戶端們,tmux 讓你可以在一個終端中管理多個會話。
tmux -h # 說明書
tmux # 開始 tmux
Control-B + D # 離開當前
tmux list # 列出
tmux a -t <number> # attach session
Control-D # 離開並刪除當前 session
tmux kill-session -t <number> # 刪除 session
eth_syncing
curl -X POST http://107.167.177.201:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'
eth_block
curl -X POST http://107.167.177.201:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
PS: 可搭配 jq
讓 json output 更易讀
下載 bun
sudo apt install unzip
curl -fsSL https://bun.sh/install | bash
mkdir ts
cd ts
bun init
eth_syncing
if (!process.env.RPC_URL) {
throw new Error('Missing .env')
}
const response = await fetch(process.env.RPC_URL, {
method: 'post',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
method: 'eth_syncing',
params: [],
id: 1,
}),
})
console.log(await response.json())
一開始 geth 一直找不到 peer,導致資料遲遲無法開始下載,真的很傷腦筋。
所幸目前 state 跟 chain 都穩定持續下載中,預估再三個多小時,期待明天可以順利與之互動!